home *** CD-ROM | disk | FTP | other *** search
-
-
- /*******************************************
- *
- * object_warp(..
- *
- * This routine warps a ROWSxCOLS section
- * of an image. The il, ie parameters
- * specify which ROWSxCOLS section of
- * the image to warp. The x_control and
- * y_control parameters are the control
- * points inside that section. Therefore,
- * x_control and y_control will always be
- * less the COLS and ROWS.
- *
- * The point coordinates are for the four
- * corners of a four side figure.
- * x1,y1 x2,y2
- *
- * x4,y4 x3,y3
- *
- *******************************************/
-
- object_warp(in_name, out_name,
- the_image, out_image,
- il, ie, ll, le,
- x1, y1, x2, y2, x3, y3, x4, y4,
- bilinear)
- char in_name[], out_name[];
- int bilinear, il, ie, ll, le,
- x1, y1, x2, y2, x3, y3, x4, y4;
- short the_image[ROWS][COLS],
- out_image[ROWS][COLS];
- {
- int extra_x = 0,
- extra_y = 0;
-
- struct tiff_header_struct image_header;
-
- create_file_if_needed(in_name, out_name, out_image);
-
- read_tiff_image(in_name, the_image, il, ie, ll, le);
-
- /***********************************
- *
- * Call the warp loop function you
- * need (with or without bilinear
- * interpolation).
- *
- ***********************************/
-
- if(bilinear)
- bi_full_warp_loop(the_image, out_image,
- x1, x2, x3, x4,
- y1, y2, y3, y4,
- extra_x, extra_y);
- else
- full_warp_loop(the_image, out_image,
- x1, x2, x3, x4,
- y1, y2, y3, y4,
- extra_x, extra_y);
-
- write_array_into_tiff_image(out_name, out_image,
- il, ie, ll, le);
- } /* ends object_warp */
-
-
-
-
- /*******************************************
- *
- * full_warp_loop(..
- *
- * This routine sets up the coefficients
- * and loops through an entire
- * ROWSxCOLS image that is being warped.
- *
- *******************************************/
-
- full_warp_loop(the_image, out_image,
- x1, x2, x3, x4,
- y1, y2, y3, y4,
- extra_x, extra_y)
- int extra_x, extra_y,
- x1, x2, x3, x4,
- y1, y2, y3, y4;
- short the_image[ROWS][COLS],
- out_image[ROWS][COLS];
- {
- int cols_div_2, denom, i, j, rows_div_2,
- xa, xb, xab, x_out, ya, yb, yab, y_out;
-
- cols_div_2 = COLS/2;
- rows_div_2 = ROWS/2;
- denom = cols_div_2 * rows_div_2;
-
- /***********************************
- *
- * Set up the terms for the
- * spatial transformation.
- *
- ***********************************/
-
- xa = x2 - x1;
- xb = x4 - x1;
- xab = x1 - x2 + x3 - x4;
-
- ya = y2 - y1;
- yb = y4 - y1;
- yab = y1 - y2 + y3 - y4;
-
- /***********************************
- *
- * Loop through the image and
- * perform the spatial
- * transformation.
- *
- ***********************************/
-
- /* NOTE a=j b=i */
-
- printf("\n");
- for(i=0; i<ROWS; i++){
- if( (i%10) == 0) printf("%d ", i);
- for(j=0; j<COLS; j++){
-
- x_out = x1 + (xa*j)/COLS +
- (xb*i)/ROWS + (xab*i*j)/(denom);
- y_out = y1 + (ya*j)/COLS +
- (yb*i)/ROWS + (yab*i*j)/(denom);
-
- if(x_out < 0 ||
- x_out >= COLS ||
- y_out < 0 ||
- y_out >= ROWS)
- out_image[i+extra_y][j+extra_x] = FILL;
- else
- out_image[i+extra_y][j+extra_x] =
- the_image[y_out][x_out];
-
- } /* ends loop over j */
- } /* ends loop over i */
-
- } /* ends full_warp_loop */
-
-
-
-
-
- /*******************************************
- *
- * bi_full_warp_loop(..
- *
- * This routine sets up the coefficients
- * and loops through an entire
- * ROWSxCOLS image that is being warped.
- *
- * This version of the routine uses bilinear
- * interpolation to find the gray shades.
- * It is more accurate than warp_loop,
- * but takes longer because of the floating
- * point calculations.
- *
- *******************************************/
-
- bi_full_warp_loop(the_image, out_image,
- x1, x2, x3, x4,
- y1, y2, y3, y4,
- extra_x, extra_y)
- int extra_x, extra_y,
- x1, x2, x3, x4,
- y1, y2, y3, y4;
- short the_image[ROWS][COLS],
- out_image[ROWS][COLS];
- {
- double denom, di, dj,
- xa, xb, xab, x_out, ya, yb, yab, y_out;
- int i, j;
-
- denom = COLS * ROWS;
-
- /***********************************
- *
- * Set up the terms for the
- * spatial transformation.
- *
- ***********************************/
-
- xa = x2 - x1;
- xb = x4 - x1;
- xab = x1 - x2 + x3 - x4;
-
- ya = y2 - y1;
- yb = y4 - y1;
- yab = y1 - y2 + y3 - y4;
-
- /***********************************
- *
- * Loop through the image and
- * perform the spatial
- * transformation.
- *
- ***********************************/
-
- /* NOTE a=j b=i */
-
- printf("\n");
- for(i=0; i<ROWS; i++){
- if( (i%10) == 0) printf("%d ", i);
- for(j=0; j<COLS; j++){
-
- di = (double)(i);
- dj = (double)(j);
-
- x_out = x1 +
- (xa*dj)/COLS +
- (xb*di)/ROWS +
- (xab*di*dj)/(denom);
- y_out = y1 +
- (ya*dj)/COLS +
- (yb*di)/ROWS +
- (yab*di*dj)/(denom);
-
- out_image[i+extra_y][j+extra_x] =
- bilinear_interpolate(the_image, x_out, y_out);
-
- } /* ends loop over j */
- } /* ends loop over i */
-
- } /* ends bi_full_warp_loop */
-